Итак, мы смогли что-то посчитать и это что-то напечатать. Одна проблема - данные, с которыми мы работаем, жестко заданы в программе. Значит, и результаты всегда будут те же самые. Для расчета новых данных нужно исправлять, а затем перекомпилировать программу.
Такое положение дел не может нас устраивать. К счастью, мы его сейчас исправим – изучим функцию, которая позволяет вводить данные во время работы программы. Тогда одна и та же программа сможет работать на разных данных.
Для примера напишем программу-конвертор, которая будет переводить рубли в условные единицы по курсу 30 рублей за единицу.
Итак, вот программа:
Смотрим - что в программе новенького? Одна строка, вызов функции scanf. Именно эта функция осуществляет ввод с клавиатуры. Ее параметры – строка формата и список переменных, в которые будут вводиться данные. Формат мы уже видели, и помним, что это формат для целого числа. А что это за птичка перед именем переменной r?
Это операция взятия указателя.
(100%)Врезка - Об указателях
Указатель на переменную отвечает на вопрос "где лежит переменная".
Дело в том, что в языке С при вызове функции параметры передаются по значению. То есть внутри у функции появляется копия переданной переменой, с тем же значением, с которой функция может делать что хочет. Не может только одного – сделать так, чтобы изменения в копии повлияли на исходную переменную.
Поэтому-то функции scanf передается не переменная r, а указатель на нее &r. Зная указатель ("где лежит переменная"), функция сможет изменить значение r (поместить туда то, что мы ввели с клавиатуры).
Поэтому в списке scanf перед именами переменных обычно стоят птички (амперсанды, &).
Конечно, у указателей есть применения и кроме этого ;)
Ладно. Запускаем. Работает?
Пробуем ввести 45 рублей. По идее должно получиться 1.5, но печатается 1. Кто нас обманывает?
Мы сами.
Компьютер обладает забавным свойством – он делает именно то, что мы ему приказали. А не то, что мы ДУМАЛИ приказать.
Наши переменные имеют тип int (целые). При делении целых чисел в С получается целый результат:
(50%)Врезка - Типы данных и соответствующие ключи формата
Типы данных это не только ценный мех слова, стоящие в описании переменной. Это еще и диапазон принимаемых переменной значений, и операции, которые с этими значениями можно произвести.
Для нас это в том числе и способ ввести / вывести эти переменные. То есть, символы формата для функций printf, scanf.
Перечислим те типы, которые нам понадобятся:
Тип данных
Обозначение
Диапазон
Формат ввода/вывода
Примечания
Целое
int
-2147483648..2147483647 для 4х байтного целого
%d
зависит от реализации, обычно 4 байта
Вещественное двойной точности
double
+/- 1e307
f,e,g вывод, lf ввод
16 значащих цифр
Символ
char
0..255 или -128..127
%c
один символ
Строка
char*
это массив символов, завершенный символом с кодом 0
%s
На самом деле типа "строка" нет, это указатель на символ
У нас это будет double - вещественное число двойной точности, для краткости просто "вещественное".
Все изменения, которые потребуется внести в программу - это поменять тип int на double и поменять строку формата в функциях printf и scanf. Формат будет %lf
Проверяем. Вводим 45, получаем: 1.500000
Вводим 50, получаем: 1.666667
Цифр после запятой явно многовато. Это лечится изменением строки формата в операции печати: %.2lf (в общем виде - %w.dlf, число w – общая длина, число d – цифр после запятой).
Получаем: 1.67
Считаем задачу решенной.
Такое положение дел не может нас устраивать. К счастью, мы его сейчас исправим – изучим функцию, которая позволяет вводить данные во время работы программы. Тогда одна и та же программа сможет работать на разных данных.
Для примера напишем программу-конвертор, которая будет переводить рубли в условные единицы по курсу 30 рублей за единицу.
Итак, вот программа:
Смотрим - что в программе новенького? Одна строка, вызов функции scanf. Именно эта функция осуществляет ввод с клавиатуры. Ее параметры – строка формата и список переменных, в которые будут вводиться данные. Формат мы уже видели, и помним, что это формат для целого числа. А что это за птичка перед именем переменной r?
Это операция взятия указателя.
Указатель на переменную отвечает на вопрос "где лежит переменная".
Дело в том, что в языке С при вызове функции параметры передаются по значению. То есть внутри у функции появляется копия переданной переменой, с тем же значением, с которой функция может делать что хочет. Не может только одного – сделать так, чтобы изменения в копии повлияли на исходную переменную.
Поэтому-то функции scanf передается не переменная r, а указатель на нее &r. Зная указатель ("где лежит переменная"), функция сможет изменить значение r (поместить туда то, что мы ввели с клавиатуры).
Поэтому в списке scanf перед именами переменных обычно стоят птички (амперсанды, &).
Конечно, у указателей есть применения и кроме этого ;)
Ладно. Запускаем. Работает?
Пробуем ввести 45 рублей. По идее должно получиться 1.5, но печатается 1. Кто нас обманывает?
Мы сами.
Компьютер обладает забавным свойством – он делает именно то, что мы ему приказали. А не то, что мы ДУМАЛИ приказать.
Наши переменные имеют тип int (целые). При делении целых чисел в С получается целый результат:
- 45/30 => 1
Пора изучить следующий тип данных.Типы данных это не только ценный мех слова, стоящие в описании переменной. Это еще и диапазон принимаемых переменной значений, и операции, которые с этими значениями можно произвести.
Для нас это в том числе и способ ввести / вывести эти переменные. То есть, символы формата для функций printf, scanf.
Перечислим те типы, которые нам понадобятся:
У нас это будет double - вещественное число двойной точности, для краткости просто "вещественное".
Все изменения, которые потребуется внести в программу - это поменять тип int на double и поменять строку формата в функциях printf и scanf. Формат будет %lf
Проверяем. Вводим 45, получаем: 1.500000
Вводим 50, получаем: 1.666667
Цифр после запятой явно многовато. Это лечится изменением строки формата в операции печати: %.2lf (в общем виде - %w.dlf, число w – общая длина, число d – цифр после запятой).
Получаем: 1.67
Считаем задачу решенной.